"""
https://leetcode.cn/problems/edit-distance/description/


72. 编辑距离
已解答
中等
相关标签
相关企业
给你两个单词 word1 和 word2， 请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作：

插入一个字符
删除一个字符
替换一个字符
 

示例 1：

输入：word1 = "horse", word2 = "ros"
输出：3
解释：
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
示例 2：

输入：word1 = "intention", word2 = "execution"
输出：5
解释：
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')
 

提示：

0 <= word1.length, word2.length <= 500
word1 和 word2 由小写英文字母组成
"""

class Solution:
    """
    典型的二维动态规划
    使用dp[row][col]表示word1[:row]和word2[:col]的最少操作数
    1. dp[0][x]=dp[x][0]=x
    2. if word1[row]=word2[col] then dp[row+1][col+1]=dp[row][col]
    3. else dp[row+1][col+1]=min(dp[row][col],dp[row+1][col],dp[row][col+1])+1


    """
    def minDistance(self, word1: str, word2: str) -> int:
        # word1的i1表示第几行，word2的i2表示第几列
        dp=[[0]*(len(word2)+1) for _ in range(len(word1)+1)]
        for row,c in enumerate(word1):
            dp[row+1][0]=row+1
        for col,c in enumerate(word2):
            dp[0][col+1]=col+1
        for row,c1 in enumerate(word1):
            for col,c2 in enumerate(word2):
                if c1==c2:
                    dp[row+1][col+1]=dp[row][col]
                else:
                    dp[row+1][col+1]=min(dp[row][col],dp[row+1][col],dp[row][col+1])+1

        return dp[-1][-1]

if __name__=='__main__':
    word1,word2='','e'
    sol=Solution()
    res=sol.minDistance(word1,word2)
    print(res)
    pass